import Store from '../store'
import $ from 'jquery'
import locale from '../locale/locale'
import { modelHTML } from './constant'
import sheetmanage from './sheetmanage'
import luckysheetsizeauto from './resize'
import dataVerificationCtrl from './dataVerificationCtrl'
import { replaceHtml,transformRangeToAbsolute,openSelfModel } from '../utils/util'
import { selectionCopyShow } from './select'
import tooltip from '../global/tooltip'
import escapeHtml from 'escape-html'

let isInitialProtection = false, isInitialProtectionAddRang = false, rangeItemListCache=[], isAddRangeItemState=true, updateRangeItemIndex = null, validationAuthority=null, updatingSheetFile=null, firstInputSheetProtectionPassword = true
let inputRangeProtectionPassword = {}, initialRangePasswordHtml=false

const authorityItemArr = [
    'selectLockedCells',
    'selectunLockedCells',
    'formatCells',
    'formatColumns',
    'formatRows',
    'insertColumns',
    'insertRows',
    'insertHyperlinks',
    'deleteColumns',
    'deleteRows',
    'sort',
    'filter',
    'usePivotTablereports',
    'editObjects',
    'editScenarios'
]

function addRangeItem(item){
    const _locale = locale()
    const local_protection = _locale.protection
    const locale_button = _locale.button

    let title = item.name, sqref = item.sqref, password = item.password

    let passwordTxt = ''
    if(password!=null && password.length>0){
        passwordTxt = '<i class="icon iconfont luckysheet-iconfont-bianji2" title="'+ local_protection.rangeItemHasPassword+'"></i>'
    }

    let rangeItemTemplate = `
        <div class="luckysheet-protection-rangeItem" title="${local_protection.rangeItemDblclick}">
            <div class="luckysheet-protection-rangeItem-del" title="${locale_button.delete}">
                <i class="icon iconfont luckysheet-iconfont-shanchu"></i>
            </div>
            <div class="luckysheet-protection-rangeItem-name" title="${escapeHtml(title)}">
                ${escapeHtml(title)}${passwordTxt}
            </div>
            <div class="luckysheet-protection-rangeItem-range" title="${escapeHtml(sqref)}">
                ${escapeHtml(sqref)}
            </div>
            <div class="luckysheet-protection-rangeItem-update" title="${locale_button.update}">
                <i class="icon iconfont luckysheet-iconfont-bianji"></i>
            </div>
        </div>
    `

    $('#luckysheet-protection-rangeItem-container').append(rangeItemTemplate)
}

function initialEvent(file){

    const _locale = locale()
    const local_protection = _locale.protection
    const locale_button = _locale.button

    //confirm protection
    $('#luckysheet-slider-protection-ok').click(function(){
        let password = '••••••••' //$("#protection-password").val();
        let sheet = $('#protection-swichProtectionState').is(':checked')
        let hint = $('#protection-hint').val()

        let file = updatingSheetFile, aut = {}

        if(file!=null && file.config!=null && file.config.authority!=null){
            aut = file.config.authority
        }

        let authorityData = {

        }

        let algorithmName = 'None'
        if(password!='••••••••'){
            authorityData.password = password
            authorityData.algorithmName = 'None'
            authorityData.saltValue = null
        }
        else if(aut!=null){
            authorityData.algorithmName = aut.algorithmName
            authorityData.saltValue = aut.saltValue
            authorityData.password = aut.password
        }
        else {
            authorityData.algorithmName = 'None'
            authorityData.saltValue = null
            authorityData.password = ''
        }

        authorityData.hintText = hint

        authorityData.sheet = sheet==true?1:0

        for(let i=0;i<authorityItemArr.length;i++){
            let name = authorityItemArr[i]
            let checkId = 'luckysheet-protection-check-' + name
            let authorityValue =  $('#'+checkId).is(':checked')

            authorityData[name] = authorityValue==true?1:0
        }

        authorityData.allowRangeList = rangeItemListCache

        rangeItemListCache = []
        firstInputSheetProtectionPassword = true

        if(file.config==null){
            file.config = {}
        }

        file.config.authority = authorityData

        inputRangeProtectionPassword = {}

        closeProtectionModal()

    })

    //cancel protection
    $('#luckysheet-slider-protection-cancel, #luckysheet-modal-dialog-protection-close').click(function(){
        closeProtectionModal()
    })

    //Add allow edit range
    $('#luckysheet-slider-protection-addRange').click(function(){
        initialProtectionRangeModal()
        isAddRangeItemState = true
        $('#luckysheet-protection-rangeItem-confirm').html(locale_button.insert)

        openSelfModel('luckysheet-protection-rangeItem-dialog')

        $('#protection-allowRangeAdd-title').val('Default'+rangeItemListCache.length)
        $('#protection-allowRangeAdd-range input').val('')
        $('#protection-allowRangeAdd-password').val('')
        $('#protection-allowRangeAdd-hint').val('')

    })

    //update allow edit range
    $(document).off('click.luckysheetProtection.rangeItemUpdate').on('click.luckysheetProtection.rangeItemUpdate','#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-update', function(e){
        initialProtectionRangeModal()

        isAddRangeItemState = false
        $('#luckysheet-protection-rangeItem-confirm').html(locale_button.update)

        openSelfModel('luckysheet-protection-rangeItem-dialog')

        let $rangeItem = $(e.target).closest('.luckysheet-protection-rangeItem')

        let $rangeItemContainer =  $('#luckysheet-protection-rangeItem-container')

        let index = $rangeItemContainer.find('> div.luckysheet-protection-rangeItem').index($rangeItem)

        let item = rangeItemListCache[index]

        updateRangeItemIndex = index

        $('#protection-allowRangeAdd-title').val(item.name)
        $('#protection-allowRangeAdd-range input').val(item.sqref)
        if(item.algorithmName=='None'){
            $('#protection-allowRangeAdd-password').val(item.password)
        }
        else{
            $('#protection-allowRangeAdd-password').val('••••••••')
        }
        $('#protection-allowRangeAdd-hint').val(item.hintText)
    })

    //delete allow edit range
    $(document).off('click.luckysheetProtection.rangeItemDelete').on('click.luckysheetProtection.rangeItemDelete','#luckysheet-protection-rangeItem-container .luckysheet-protection-rangeItem-del', function(e){
        let $rangeItem = $(e.target).closest('.luckysheet-protection-rangeItem')

        let $rangeItemContainer =  $('#luckysheet-protection-rangeItem-container')

        let index = $rangeItemContainer.find('> div.luckysheet-protection-rangeItem').index($rangeItem)

        rangeItemListCache.splice(index, 1)
        $rangeItem.remove()
    })

    //confirm allow edit range
    $(document).off('click.luckysheetProtection.rangeItemConfirm').on('click.luckysheetProtection.rangeItemConfirm','#luckysheet-protection-rangeItem-confirm', function(){
        let name = $('#protection-allowRangeAdd-title').val(),
        rangeText = $('#protection-allowRangeAdd-range input').val(),
        password = $('#protection-allowRangeAdd-password').val(),
        hint = $('#protection-allowRangeAdd-hint').val()

        if(name.length==0){
            alert(local_protection.rangeItemErrorTitleNull)
            return
        }

        let range = dataVerificationCtrl.getRangeByTxt(rangeText)

        if(rangeText.length==0){
            alert(local_protection.rangeItemErrorRangeNull)
            return
        }

        if(range.length==0){
            alert(local_protection.rangeItemErrorRange)
            return
        }

        rangeText = transformRangeToAbsolute(rangeText)


        if(isAddRangeItemState){
            let item = {
                name:name,
                password:password,
                hintText:hint,
                algorithmName:'None',//MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,WHIRLPOOL
                saltValue:null,
                checkRangePasswordUrl:null,
                sqref:rangeText
            }

            addRangeItem(item)
            rangeItemListCache.push(item)
        }
        else{
            let index = updateRangeItemIndex
            let item = rangeItemListCache[index]

            item.name = name
            item.sqref = rangeText
            item.hintText = hint

            if(password!='••••••••'){
                item.password = password
                item.algorithmName = 'None'
            }

            let $rangeItemContainer =  $('#luckysheet-protection-rangeItem-container')

            let $rangeitem = $rangeItemContainer.find('> div.luckysheet-protection-rangeItem').eq(index)

            let $name = $rangeitem.find('.luckysheet-protection-rangeItem-name')

            let passwordTxt = ''
            if(password!=null && password.length>0){
                passwordTxt = '<i class="icon iconfont luckysheet-iconfont-bianji2" title="'+ local_protection.rangeItemHasPassword+'"></i>'
            }

            $name.html(escapeHtml(name) + passwordTxt).attr('title',name)

            let $range = $rangeitem.find('.luckysheet-protection-rangeItem-range')

            $range.text(rangeText).attr('title',rangeText)
        }

        $('#luckysheet-protection-rangeItem-dialog').hide()
        $('#luckysheet-modal-dialog-mask').hide()
    })


    //sheet validation check passWord
    $(document).off('click.luckysheetProtection.validationConfirm').on('click.luckysheetProtection.validationConfirm','#luckysheet-protection-sheet-validation-confirm', function(e){
        let $validation = $('#luckysheet-protection-sheet-validation')
        let aut = validationAuthority

        if(aut==null){
            restoreProtectionConfig(validationAuthority)
            $validation.hide()
            $('#luckysheet-modal-dialog-mask').hide()
            $('#luckysheet-modal-dialog-slider-protection').show()
            luckysheetsizeauto()
            return
        }

        let $input = $validation.find('input')
        let password = $input.val()


        if(password==null || password.length==0){
            alert(local_protection.checkPasswordNullalert)
            return
        }

        if(aut.algorithmName!=null && aut.algorithmName!='None'){
            if(aut.saltValue!=null && aut.saltValue.length>0){
                var hasher = CryptoApi.getHasher(aut.algorithmName)
                password =CryptoApi.hmac(aut.saltValue, password, hasher)
            }
            else{
                password = CryptoApi.hash(aut.algorithmName, password)
            }
        }

        if(password==aut.password){
            restoreProtectionConfig(validationAuthority)
            $validation.hide()
            $('#luckysheet-modal-dialog-mask').hide()
            $('#luckysheet-modal-dialog-slider-protection').show()
            luckysheetsizeauto()
            firstInputSheetProtectionPassword = false
        }
        else{
            alert(local_protection.checkPasswordWrongalert)
        }

    })

    $('#luckysheet-protection-check-selectLockedCells').change(function() {
        let $selectLockedCells = $('#luckysheet-protection-check-selectLockedCells'), $selectunLockedCells = $('#luckysheet-protection-check-selectunLockedCells')

        let selectLockedCellsChecked = $selectLockedCells.is(':checked'), selectunLockedCellsChecked = $selectunLockedCells.is(':checked')

        if(selectLockedCellsChecked){
            $selectunLockedCells.prop('checked', true)
        }
    })

    $('#luckysheet-protection-check-selectunLockedCells').change(function() {
        let $selectLockedCells = $('#luckysheet-protection-check-selectLockedCells'), $selectunLockedCells = $('#luckysheet-protection-check-selectunLockedCells')

        let selectLockedCellsChecked = $selectLockedCells.is(':checked'), selectunLockedCellsChecked = $selectunLockedCells.is(':checked')

        if(!selectunLockedCellsChecked){
            $selectLockedCells.prop('checked', false)
        }
    })


    //Cell range select controll
    $(document).off('click.luckysheetProtection.dvRange').on('click.luckysheetProtection.dvRange', '#protection-allowRangeAdd-range .fa-table', function(e) {
        $('#luckysheet-protection-rangeItem-dialog').hide()

        let dataSource = '0'
        let txt = $(this).siblings('input').val().trim()

        dataVerificationCtrl.rangeDialog(dataSource, txt)

        dataVerificationCtrl.selectRange = []

        let range = dataVerificationCtrl.getRangeByTxt(txt)
        if(range.length > 0){
            for(let s = 0; s < range.length; s++){
                let r1 = range[s].row[0], r2 = range[s].row[1]
                let c1 = range[s].column[0], c2 = range[s].column[1]

                let row = Store.visibledatarow[r2],
                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]
                let col = Store.visibledatacolumn[c2],
                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

                dataVerificationCtrl.selectRange.push({
                    'left': col_pre,
                    'width': col - col_pre - 1,
                    'top': row_pre,
                    'height': row - row_pre - 1,
                    'left_move': col_pre,
                    'width_move': col - col_pre - 1,
                    'top_move': row_pre,
                    'height_move': row - row_pre - 1,
                    'row': [r1, r2],
                    'column': [c1, c2],
                    'row_focus': r1,
                    'column_focus': c1
                })
            }
        }

        selectionCopyShow(dataVerificationCtrl.selectRange)
    })
    $(document).off('click.luckysheetProtection.dvRange2').on('click.luckysheetProtection.dvRange2', '#luckysheet-protection-rangeItem-dialog .show-box-item-dropdown .range .fa-table', function(e) {
        $('#luckysheet-protection-rangeItem-dialog').hide()

        let dataSource = '1'
        let txt = $(this).siblings('input').val().trim()

        dataVerificationCtrl.rangeDialog(dataSource, txt)

        dataVerificationCtrl.selectRange = []

        let range = dataVerificationCtrl.getRangeByTxt(txt)
        if(range.length > 0){
            for(let s = 0; s < range.length; s++){
                let r1 = range[s].row[0], r2 = range[s].row[1]
                let c1 = range[s].column[0], c2 = range[s].column[1]

                let row = Store.visibledatarow[r2],
                    row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]
                let col = Store.visibledatacolumn[c2],
                    col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]

                    dataVerificationCtrl.selectRange.push({
                    'left': col_pre,
                    'width': col - col_pre - 1,
                    'top': row_pre,
                    'height': row - row_pre - 1,
                    'left_move': col_pre,
                    'width_move': col - col_pre - 1,
                    'top_move': row_pre,
                    'height_move': row - row_pre - 1,
                    'row': [r1, r2],
                    'column': [c1, c2],
                    'row_focus': r1,
                    'column_focus': c1
                })
            }
        }

        selectionCopyShow(dataVerificationCtrl.selectRange)
    })
    $(document).off('click.luckysheetProtection.dvRangeConfirm').on('click.luckysheetProtection.dvRangeConfirm', '#luckysheet-dataVerificationRange-dialog-confirm', function(e) {
        let txt = $(this).parents('#luckysheet-dataVerificationRange-dialog').find('input').val()

        let $input = $('#protection-allowRangeAdd-range input'), inputValue = $input.val()
        if(inputValue.substr(inputValue.length-1, 1)==','){
            $input.val(inputValue + txt)
        }
        else{
            $input.val(txt)
        }
        $('#luckysheet-dataVerificationRange-dialog').hide()
        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-protection-rangeItem-dialog').show()

        let range = []
        selectionCopyShow(range)
    })
    $(document).off('click.luckysheetProtection.dvRangeClose').on('click.dvRangeClose', '#luckysheet-dataVerificationRange-dialog-close', function(e) {
        $('#luckysheet-dataVerificationRange-dialog').hide()
        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-protection-rangeItem-dialog').show()

        let range = []
        selectionCopyShow(range)
    })
    $(document).on('click.luckysheetProtection.luckysheetProtection', '#luckysheet-dataVerificationRange-dialog .luckysheet-modal-dialog-title-close', function(e) {
        $('#luckysheet-dataVerificationRange-dialog').hide()
        $('#luckysheet-modal-dialog-mask').show()
        $('#luckysheet-protection-rangeItem-dialog').show()

        let range = []
        selectionCopyShow(range)
    })
}

//protect range config
function initialProtectionRangeModal(){
    if(isInitialProtectionAddRang){
        return
    }
    isInitialProtectionAddRang = true
    let _locale = locale()
    let local_protection = _locale.protection
    const locale_button = _locale.button
    $('body').append(replaceHtml(modelHTML, {
        'id': 'luckysheet-protection-rangeItem-dialog',
        'addclass': 'luckysheet-protection-rangeItem-dialog',
        'title': local_protection.allowRangeTitle,
        'content': `
            <div class="luckysheet-protection-rangeItem-content">
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">
                        ${local_protection.allowRangeAddTitle}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">
                        <input class="luckysheet-protection-rangeItemiInput" id="protection-allowRangeAdd-title"  placeHolder="${local_protection.allowRangeAddtitleDefault}">
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">
                        ${local_protection.allowRangeAddSqrf}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">
                        <div id="protection-allowRangeAdd-range" class="range">
                            <input class="formulaInputFocus" spellcheck="false" placeHolder="${local_protection.selectCellRangeHolder}">
                            <i class="fa fa-table" aria-hidden="true" title="${local_protection.selectCellRange}"></i>
                        </div>
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">
                        ${local_protection.allowRangeAddTitlePassword}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">
                        <input class="luckysheet-protection-rangeItemiInput" id="protection-allowRangeAdd-password"  placeHolder="${local_protection.enterPassword}">
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x">
                        ${local_protection.allowRangeAddTitleHint}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:30%">
                        <textarea class="luckysheet-protection-rangeItemTextarea" id="protection-allowRangeAdd-hint"  placeHolder="${local_protection.allowRangeAddTitleHintTitle}"></textarea>
                    </div>
                </div>
            </div>
        `,
        'botton':  `<button id="luckysheet-protection-rangeItem-confirm" class="btn btn-primary">${locale_button.insert}</button>
                    <button class="btn btn-default luckysheet-model-close-btn">${locale_button.cancel}</button>`,
        'style': 'z-index:100003'
    }))
}


//Protect sheet initial
function initialProtectionRIghtBar(file){
    const _locale = locale()
    const local_protection = _locale.protection
    const locale_button = _locale.button

    let authorityItemHtml = ''
    for(let i=0;i<authorityItemArr.length;i++){
        let name = authorityItemArr[i]

        authorityItemHtml += `
            <div class="luckysheet-slider-protection-row" style="height:18px;">
                <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                <label for="luckysheet-protection-check-${name}"><input id="luckysheet-protection-check-${name}" name="luckysheet-protection-check-${name}" type="checkbox">${local_protection[name]}</label>
                </div>
            </div>
        `
    }

    const protectionModalHtml = `
    <div id="luckysheet-modal-dialog-slider-protection" class="luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-pivot" style="display:none;">
        <div class="luckysheet-modal-dialog-slider-title"> <span>${local_protection.protectiontTitle}</span> <span id="luckysheet-modal-dialog-protection-close" title="${locale_button.close}"><i class="fa fa-times" aria-hidden="true"></i></span> </div>
        <div class="luckysheet-modal-dialog-slider-content">
            <div class="luckysheet-slider-protection-config" style="top:10px;height:45px">
                <div class="luckysheet-slider-protection-row">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                    <label for="protection-swichProtectionState"><input id="protection-swichProtectionState" name="protection-swichProtectionState" type="checkbox">${local_protection.swichProtectionTip}</label>
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row" style="height:23px; display: none">
                    <div class="luckysheet-slider-protection-column" style="width:98%;">
                        <input class="luckysheet-protection-input" id="protection-password"  placeHolder="${local_protection.enterPassword}">
                    </div>
                </div>
                <div class="luckysheet-slider-protection-row" style="height:47px;margin-top:4px; display: none">
                    <div class="luckysheet-slider-protection-column" style="width:98%;">
                        <textarea class="luckysheet-protection-textarea" id="protection-hint"  placeHolder="${local_protection.enterHint}"></textarea>
                    </div>
                </div>
            </div>
            <div class="luckysheet-slider-protection-config" style="top:55px;height:290px;border-top:1px solid #c5c5c5">
                <div class="luckysheet-slider-protection-row" style="height:20px;">
                    ${local_protection.authorityTitle}
                </div>
                ${authorityItemHtml}
            </div>
            <div class="luckysheet-slider-protection-config" style="top:365px;bottom:45px;border-top:1px solid #c5c5c5">
                <div class="luckysheet-slider-protection-row" style="height:25px;">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-7x" style="left:0px;line-height: 25px;">
                        ${local_protection.allowRangeTitle}
                    </div>
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-3x" style="left:70%;">
                        <div class="luckysheet-slider-protection-ok luckysheet-slider-protection-addRange" id="luckysheet-slider-protection-addRange">
                            ${local_protection.allowRangeAdd}
                        </div>
                    </div>
                </div>
                <div id="luckysheet-protection-rangeItem-container" class="luckysheet-slider-protection-row" style="top:25px;bottom:0px;position:absolute">
                </div>
            </div>
        </div>
        <div class="luckysheet-slider-protection-config" style="bottom:0px;height:45px">
            <div class="luckysheet-slider-protection-column luckysheet-protection-column-5x" style="left:0px;">
                <div class="luckysheet-slider-protection-ok" id="luckysheet-slider-protection-ok">
                    ${locale_button.confirm}
                </div>
            </div>
            <div class="luckysheet-slider-protection-column luckysheet-protection-column-5x" style="left:50%;">
                <div class="luckysheet-slider-protection-cancel" id="luckysheet-slider-protection-cancel">
                    ${locale_button.cancel}
                </div>
            </div>
        </div>
    </div>
    `

    $('body').append(protectionModalHtml)


    //Password input initial for sheet Protection
    $('body').append(replaceHtml(modelHTML, {
        'id': 'luckysheet-protection-sheet-validation',
        'addclass': 'luckysheet-protection-sheet-validation',
        'title': local_protection.validationTitle,
        'content': `
            <div class="luckysheet-slider-protection-row">
                <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                    ${local_protection.validationTips}
                </div>
            </div>
            <div class="luckysheet-slider-protection-row" style="margin-top:20px">
                <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                    <input type="password" class="luckysheet-protection-rangeItemiInput" placeHolder="${local_protection.validationInputHint}">
                </div>
            </div>
        `,
        'botton':  `<button id="luckysheet-protection-sheet-validation-confirm" class="btn btn-primary">${locale_button.confirm}</button>
                    <button class="btn btn-default luckysheet-model-close-btn">${locale_button.cancel}</button>`,
        'style': 'z-index:100003'
    }))

}


function restoreProtectionConfig(aut){
    if(aut==null){
        aut = {}
    }
    for(let i=0;i<authorityItemArr.length;i++){
        let name = authorityItemArr[i]
        let checkId = 'luckysheet-protection-check-' + name
        let authorityValue = aut[name]
        if(authorityValue==null){
            authorityValue = 0
        }

        if(authorityValue==null && name in {selectLockedCells:1, selectunLockedCells:1}){
            authorityValue = 1
        }

        $('#'+checkId).prop('checked',authorityValue==1?true:false)
    }

    if(aut.password!=null && aut.password.length>0){
        if(aut.algorithmName=='None' || aut.algorithmName==null){
            $('#protection-password').val(aut.password)
        }
        else{
            $('#protection-password').val('••••••••')
        }
    }
    else{
        $('#protection-password').val('')
    }

    let sheet = aut.sheet
    if(aut.sheet==null){
        sheet = 0
    }
    $('#protection-swichProtectionState').prop('checked',sheet==1?true:false)

    let hintText = aut.hintText
    if(hintText==null){
        hintText = ''
    }
    $('#protection-hint').val(hintText)


    rangeItemListCache = []
    $('#luckysheet-protection-rangeItem-container').empty()
    let allowRangeList = aut.allowRangeList
    if(allowRangeList!=null && allowRangeList.length>0){
        for(let i=0;i<allowRangeList.length;i++){
            let item = allowRangeList[i]
            addRangeItem(item)
            rangeItemListCache.push(item)
        }
    }

}

export function openProtectionModal(file){
    if(!isInitialProtection){
        initialProtectionRIghtBar(file)
        initialEvent(file)
        isInitialProtection = true
    }

    updatingSheetFile = file


    if(file!=null && file.config!=null && file.config.authority!=null){
        let aut = file.config.authority
        if(firstInputSheetProtectionPassword && aut.sheet==1 && aut.password!=null && aut.password.length>0){
            validationAuthority = aut
            $('#luckysheet-protection-sheet-validation input').val('')
            openSelfModel('luckysheet-protection-sheet-validation')
            return
        }
        else{//retore protection config
            restoreProtectionConfig(aut)
        }
    }
    else{//protection initial config
        $('#luckysheet-protection-check-selectLockedCells').prop('checked',true)
        $('#luckysheet-protection-check-selectunLockedCells').prop('checked',true)
    }

    $('#luckysheet-modal-dialog-slider-protection').show()
    luckysheetsizeauto()

}

export function closeProtectionModal(){
    $('#luckysheet-protection-rangeItem-dialog').hide()
    $('#luckysheet-modal-dialog-slider-protection').hide()
    luckysheetsizeauto()
}




function checkProtectionLockedSqref(r, c, aut, local_protection, isOpenAlert=true, isLock=true){
    let isPass = false
    let rangeAut = aut.allowRangeList
    if(rangeAut!=null && rangeAut.length>0){
        let isExists = false
        for(let i=0;i<rangeAut.length;i++){
            let ra = rangeAut[i]
            let sqref = ra.sqref
            let range = dataVerificationCtrl.getRangeByTxt(sqref)

            if(range.length > 0){
                for(let s = 0; s < range.length; s++){
                    let r1 = range[s].row[0], r2 = range[s].row[1]
                    let c1 = range[s].column[0], c2 = range[s].column[1]

                    if(r>=r1 && r<=r2 && c>=c1 && c<=c2){
                        isExists = true
                        break
                    }
                }
            }

            if(isExists){

                let password = ra.password
                if(password!=null && password.length>0  && !(sqref in inputRangeProtectionPassword)){
                    if(isOpenAlert){
                        openRangePasswordModal(ra)
                        $('#luckysheet-selection-copy .luckysheet-selection-copy').hide()
                    }
                    return false
                }
                else{
                    isPass = true
                }

                break
            }
        }
    }
    if (!isPass && !isLock) isPass = true
    if(!isPass && isOpenAlert){
        let ht
        if(aut.hintText != null && aut.hintText.length>0){
            ht = aut.hintText
        }
        else{
            ht = local_protection.defaultSheetHintText
        }
        tooltip.info('', ht)
        $('#luckysheet-selection-copy .luckysheet-selection-copy').hide()
    }

    return isPass
}


function openRangePasswordModal(rangeAut) {
    const _locale = locale()
    const local_protection = _locale.protection
    const locale_button = _locale.button

    if(!initialRangePasswordHtml){
        //Password input initial for range
        $('body').append(replaceHtml(modelHTML, {
            'id': 'luckysheet-protection-range-validation',
            'addclass': 'luckysheet-protection-sheet-validation',
            'title': local_protection.validationTitle,
            'content': `
                <div class="luckysheet-slider-protection-row">
                    <div id="luckysheet-protection-range-validation-hint" class="luckysheet-slider-protection-column luckysheet-protection-column-10x">

                    </div>
                </div>
                <div class="luckysheet-slider-protection-row" style="margin-top:20px">
                    <div class="luckysheet-slider-protection-column luckysheet-protection-column-10x">
                        <input type="password" class="luckysheet-protection-rangeItemiInput" placeHolder="${local_protection.validationInputHint}">
                    </div>
                </div>
            `,
            'botton':  `<button id="luckysheet-protection-range-validation-confirm" class="btn btn-primary">${locale_button.confirm}</button>
                        <button class="btn btn-default luckysheet-model-close-btn">${locale_button.cancel}</button>`,
            'style': 'z-index:100003'
        }))
    }

    initialRangePasswordHtml = true



    openSelfModel('luckysheet-protection-range-validation')

    let $hint = $('#luckysheet-protection-range-validation-hint')
    if(rangeAut.hintText != null && rangeAut.hintText.length>0){
        $hint.text(rangeAut.hintText)
    }
    else{
        $hint.html(local_protection.defaultRangeHintText)
    }
    let $rangeV = $('#luckysheet-protection-range-validation')
    let $input = $rangeV.find('input')
    $input.val('')

    $('#luckysheet-protection-range-validation-confirm').off('click').on('click', function(){
        let password = $input.val()

        if(password==null || password.length==0){
            alert(local_protection.checkPasswordNullalert)
            return
        }

        if(rangeAut.algorithmName!=null && rangeAut.algorithmName!='None'){
            // password = CryptoApi.hash(rangeAut.algorithmName, password);
            if(rangeAut.saltValue!=null && rangeAut.saltValue.length>0){
                var hasher = CryptoApi.getHasher(rangeAut.algorithmName)
                password =CryptoApi.hmac(rangeAut.saltValue, password, hasher)
            }
            else{
                password = CryptoApi.hash(rangeAut.algorithmName, password)
            }
        }

        if(password==rangeAut.password){
            inputRangeProtectionPassword[rangeAut.sqref] = 1
            $rangeV.hide()
            $('#luckysheet-modal-dialog-mask').hide()
            alert(local_protection.checkPasswordSucceedalert)
        }
        else{
            alert(local_protection.checkPasswordWrongalert)
        }
    })
}

//protection state
export function checkProtectionNotEnable(sheetIndex){
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex)
    if(sheetFile==null){
        return true
    }

    if(sheetFile.config==null || sheetFile.config.authority==null){
        return true
    }

    let aut = sheetFile.config.authority

    if(aut==null || aut.sheet==null || aut.sheet==0 ){
        return true
    }

    const _locale = locale()
    const local_protection = _locale.protection

    let ht
    if(aut.hintText != null && aut.hintText.length>0){
        ht = aut.hintText
    }
    else{
        ht = local_protection.defaultSheetHintText
    }
    tooltip.info('', ht)

    return false
}

//cell locked state
export function checkProtectionLocked(r, c, sheetIndex, isOpenAlert=true, isLock=true){

    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex)
    if(sheetFile==null){
        return true
    }

    if(sheetFile.config==null || sheetFile.config.authority==null){
        return true
    }

    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority

    if(aut==null || aut.sheet==null || aut.sheet==0 ){
        return true
    }

    if(cell && cell.lo === 0){ // lo为0的时候才是可编辑
        return true
    }

    const _locale = locale()
    const local_protection = _locale.protection

    return checkProtectionLockedSqref(r, c , aut, local_protection, isOpenAlert, isLock)
}

//cell hidden state
export function checkProtectionCellHidden(r, c, sheetIndex){
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex)
    if(!sheetFile || (sheetFile.data && !sheetFile.data[r]) || (sheetFile.data && !sheetFile.data[r][c])){
        return true
    }

    if(sheetFile.config==null || sheetFile.config.authority==null){
        return true
    }

    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority

    if(aut==null || aut.sheet==null || aut.sheet==0 ){
        return true
    }

    if(cell==null || cell.hi==null || cell.hi==0){
        return true
    }

    return false
}

//cell range locked state
export function checkProtectionLockedRangeList(rangeList, sheetIndex){
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex)

    if(sheetFile==null){
        return true
    }

    if(sheetFile.config==null || sheetFile.config.authority==null){
        return true
    }

    let aut = sheetFile.config.authority

    if(aut==null || aut.sheet==null || aut.sheet==0 ){
        return true
    }

    if(rangeList==null || rangeList.length==0){
        return true
    }

    const _locale = locale()
    const local_protection = _locale.protection

    for(let s = 0; s < rangeList.length; s++){
        let r1 = rangeList[s].row[0], r2 = rangeList[s].row[1]
        let c1 = rangeList[s].column[0], c2 = rangeList[s].column[1]

        for(let r=r1;r<=r2;r++){
            for(let c=c1;c<=c2;c++){
                const cell = sheetFile.data[r][c] || {}
                let isLock = cell.lo === undefined || cell.lo === 1, // 单元格是否锁定
                    isPass = checkProtectionLockedSqref(r, c , aut, local_protection, true, isLock)
                if(!isPass){
                    return false
                }
            }
        }
    }

    return true
}

//selectLockedCells  , selectunLockedCells  and cell state
export function checkProtectionSelectLockedOrUnLockedCells(r, c, sheetIndex){
    const _locale = locale()
    const local_protection = _locale.protection
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex)
    if(sheetFile==null){
        return true
    }

    if(sheetFile.config==null || sheetFile.config.authority==null){
        return true
    }

    let data=sheetFile.data, cell=data[r][c], aut = sheetFile.config.authority

    if(aut==null || aut.sheet==null || aut.sheet==0 ){
        return true
    }

    if(cell && cell.lo === 0){ // lo为0的时候才是可编辑
        if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){
            return true
        }
        else{
            return false
        }
    }
    else{//locked??
        let isAllEdit = checkProtectionLockedSqref(r, c , aut, local_protection, false)//dont alert password model
        if(isAllEdit){//unlocked
            if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){
                return true
            }
            else{
                return false
            }
        }
        else{//locked
            if(aut.selectLockedCells==1 || aut.selectLockedCells==null){
                return true
            }
            else{
                return false
            }
        }
    }


}



//selectLockedCells or selectunLockedCells authority, highlight cell
export function checkProtectionAllSelected(sheetIndex){
    const _locale = locale()
    const local_protection = _locale.protection
    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex)
    if(sheetFile==null){
        return true
    }

    if(sheetFile.config==null || sheetFile.config.authority==null){
        return true
    }

    let aut = sheetFile.config.authority

    if(aut==null || aut.sheet==null || aut.sheet==0 ){
        return true
    }

    let selectunLockedCells = false
    if(aut.selectunLockedCells==1 || aut.selectunLockedCells==null){
        selectunLockedCells = true
    }

    let selectLockedCells = false
    if(aut.selectLockedCells==1 || aut.selectLockedCells==null){
        selectLockedCells = true
    }

    if(selectunLockedCells && selectLockedCells){
        return true
    }

    return false
}

//formatCells authority, bl cl fc fz ff ct  border etc.
export function checkProtectionFormatCells(sheetIndex){

    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex)
    if(sheetFile==null){
        return true
    }

    if(sheetFile.config==null || sheetFile.config.authority==null){
        return true
    }

    let aut = sheetFile.config.authority

    if(aut==null || aut.sheet==null || aut.sheet==0 ){
        return true
    }

    if(aut.formatCells==1 || aut.formatCells==null){
        return true
    }

    const _locale = locale()
    const local_protection = _locale.protection

    let ht
    if(aut.hintText != null && aut.hintText.length>0){
        ht = aut.hintText
    }
    else{
        ht = local_protection.defaultSheetHintText
    }
    tooltip.info('', ht)

    return false
}

//formatColumns authority: controll column hidden and width
//formatRows authority: controll row hidden and height
//insertColumns authority
//insertRows authority
//insertHyperlinks authority:Hyperlinks is not incomplete
//deleteColumns authority
//deleteRows authority
//sort authority
//filter authority
//usePivotTablereports authority
//editObjects authority: insert,delete,update for image, chart, comment,shape etc.
//editScenarios authority: Scenarios features is uncompleted

export function checkProtectionAuthorityNormal(sheetIndex, type='formatColumns', isAlert=true){

    let sheetFile = sheetmanage.getSheetByIndex(sheetIndex)
    if(sheetFile==null){
        return true
    }

    if(sheetFile.config==null || sheetFile.config.authority==null){
        return true
    }

    let aut = sheetFile.config.authority

    if(aut==null || aut.sheet==null || aut.sheet==0 ){
        return true
    }

    if(aut[type]==1 || aut[type]==null){
        return true
    }

    if(isAlert){
        const _locale = locale()
        const local_protection = _locale.protection

        let ht
        if(aut.hintText != null && aut.hintText.length>0){
            ht = aut.hintText
        }
        else{
            ht = local_protection.defaultSheetHintText
        }
        tooltip.info('', ht)
    }

    return false
}
